// 705. 设计哈希集合
// https://leetcode.cn/problems/design-hashset/description/?envType=daily-question&envId=2024-04-14

// 这题的题目描述有点奇怪，在执行add和remove方法时，并不需要返回值，但题目里没有写清楚
// 如果在add和remove中加入返回值，会超时
// 下方代码有《通过版本》和《超时版本》，超时版本的逻辑是对的，只是因为添加了返回值导致超时

/** 通过版本 */

var MyHashSet = function () {
    this.set = {};
    this.cache = [];
};

/**
 * @param {number} key
 * @return {void}
 */
MyHashSet.prototype.add = function (key) {
    this.set[key] = true;
};

/**
 * @param {number} key
 * @return {void}
 */
MyHashSet.prototype.remove = function (key) {
    delete this.set[key];
};

/**
 * @param {number} key
 * @return {boolean}
 */
MyHashSet.prototype.contains = function (key) {
    return this.set[key] ? true : false;
};

MyHashSet.prototype.refresh = function () {
    this.cache = Object.keys(this.set);
};

/**
 * Your MyHashSet object will be instantiated and called as such:
 * var obj = new MyHashSet()
 * obj.add(key)
 * obj.remove(key)
 * var param_3 = obj.contains(key)
 */

/** 超时版本 */

// var MyHashSet = function () {
//     this.set = {};
//     this.cache = [];
// };

// /**
//  * @param {number} key
//  * @return {void}
//  */
// MyHashSet.prototype.add = function (key) {
//     if (this.contains(key)) {
//         return this.cache;
//     }

//     this.set[key] = true;
//     this.refresh();
//     // console.log(`[add] ${key}, set is ${JSON.stringify(this.toString())}`);
//     return this.cache;
// };

// /**
//  * @param {number} key
//  * @return {void}
//  */
// MyHashSet.prototype.remove = function (key) {
//     if (this.contains(key)) {
//         delete this.set[key];
//         this.refresh();
//     }

//     return this.cache;
// };

// /**
//  * @param {number} key
//  * @return {boolean}
//  */
// MyHashSet.prototype.contains = function (key) {
//     return this.set[key] ? true : false;
// };

// MyHashSet.prototype.refresh = function () {
//     this.cache = Object.keys(this.set);
// };

// 测试开始
function T(x) {
    const typeOfStr = typeof obj;

    if (typeOfStr !== 'object' || typeOfStr !== 'function') console.log(x);
    else console.log(JSON.stringify(x));
}

var myHashSet = new MyHashSet();
T(myHashSet.add(1)); // set = [1]
T(myHashSet.add(2)); // set = [1, 2]
T(myHashSet.contains(1)); // true
T(myHashSet.contains(3)); // false
T(myHashSet.add(2)); // set = [1, 2]
T(myHashSet.contains(2)); // true
T(myHashSet.remove(2)); // set = [1]
T(myHashSet.contains(2)); // false
